import numpy as np
import numpy.matlib

def demonstrate_numpy_linear_algebra():
    """
    NumPy线性代数函数库演示脚本
    包含菜鸟教程中的所有线性代数函数示例
    """
    
    print("=== NumPy 线性代数函数库演示 ===\n")
    
    # 1. numpy.dot() - 点积/矩阵乘法
    print("1. numpy.dot() - 点积/矩阵乘法")
    a = np.array([[1, 2], [3, 4]])
    b = np.array([[11, 12], [13, 14]])
    print("矩阵a:")
    print(a)
    print("矩阵b:")
    print(b)
    print("点积结果:")
    print(np.dot(a, b))
    print("计算过程: [[1 * 11+2 * 13, 1 * 12+2 * 14], [3 * 11+4 * 13, 3 * 12+4 * 14]]")
    print("-" * 50)
    
    # 2. numpy.vdot() - 向量点积（展开多维数组）
    print("2. numpy.vdot() - 向量点积")
    print("vdot结果:", np.vdot(a, b))
    print("计算过程: 1 * 11 + 2 * 12 + 3 * 13 + 4 * 14 = 130")
    print("-" * 50)
    
    # 3. numpy.inner() - 向量内积
    print("3. numpy.inner() - 向量内积")
    # 一维数组示例
    vec1 = np.array([1, 2, 3])
    vec2 = np.array([0, 1, 0])
    print("一维数组内积:", np.inner(vec1, vec2))
    print("计算过程: 1 * 0 + 2 * 1 + 3 * 0 = 2")
    
    # 多维数组示例
    print("多维数组内积:")
    print(np.inner(a, b))
    print("计算过程: [[1 * 11+2 * 12, 1 * 13+2 * 14], [3 * 11+4 * 12, 3 * 13+4 * 14]]")
    print("-" * 50)
    
    # 4. numpy.matmul() - 矩阵乘积
    print("4. numpy.matmul() - 矩阵乘积")
    
    # 二维矩阵乘法
    a_mat = [[1, 0], [0, 1]]
    b_mat = [[4, 1], [2, 2]]
    print("二维矩阵乘法:")
    print(np.matmul(a_mat, b_mat))
    
    # 二维与一维运算
    vec = [1, 2]
    print("矩阵与向量乘法 (A * v):", np.matmul(a_mat, vec))
    print("向量与矩阵乘法 (v * A):", np.matmul(vec, a_mat))
    
    # 高维数组运算
    a_3d = np.arange(8).reshape(2, 2, 2)
    b_2d = np.arange(4).reshape(2, 2)
    print("高维数组矩阵乘法:")
    print(np.matmul(a_3d, b_2d))
    print("-" * 50)
    
    # 5. numpy.linalg.det() - 行列式计算
    print("5. numpy.linalg.det() - 行列式计算")
    
    # 2x2矩阵行列式
    print("2x2矩阵行列式:", np.linalg.det(a))
    print("计算过程: 1 * 4 - 2 * 3 = -2.0")
    
    # 3x3矩阵行列式
    c = np.array([[6, 1, 1], [4, -2, 5], [2, 8, 7]])
    print("3x3矩阵:")
    print(c)
    print("行列式值:", np.linalg.det(c))
    print("计算验证: 6*(-2 * 7-5 * 8) - 1*(4 * 7-5 * 2) + 1*(4 * 8-(-2)*2) = -306")
    print("-" * 50)
    
    # 6. numpy.linalg.inv() - 矩阵求逆
    print("6. numpy.linalg.inv() - 矩阵求逆")
    
    # 2x2矩阵求逆
    x = np.array([[1, 2], [3, 4]])
    y = np.linalg.inv(x)
    print("原矩阵:")
    print(x)
    print("逆矩阵:")
    print(y)
    print("验证逆矩阵 (应接近单位矩阵):")
    print(np.dot(x, y))
    print("-" * 50)
    
    # 7. numpy.linalg.solve() - 解线性方程组
    print("7. numpy.linalg.solve() - 解线性方程组")
    
    # 方程组:
    # x + y + z = 6
    # 2y + 5z = -4  
    # 2x + 5y - z = 27
    
    # 系数矩阵A
    A = np.array([[1, 1, 1], [0, 2, 5], [2, 5, -1]])
    # 常数向量b
    b = np.array([[6], [-4], [27]])
    
    print("系数矩阵A:")
    print(A)
    print("常数向量b:")
    print(b)
    
    # 方法1: 使用solve直接求解
    solution1 = np.linalg.solve(A, b)
    print("直接求解结果:")
    print(solution1)
    
    # 方法2: 使用逆矩阵求解 X = A^(-1)B
    A_inv = np.linalg.inv(A)
    solution2 = np.dot(A_inv, b)
    print("逆矩阵求解结果:")
    print(solution2)
    
    print("验证解: x=5, y=3, z=-2")
    print("-" * 50)
    
    print("=== 演示结束 ===")

def additional_examples():
    """
    附加示例：展示一些实用的线性代数应用
    """
    print("\n=== 附加实用示例 ===\n")
    
    # 示例1: 特征值和特征向量
    print("1. 特征值和特征向量计算")
    matrix = np.array([[4, 2], [1, 3]])
    eigenvalues, eigenvectors = np.linalg.eig(matrix)
    print("矩阵:")
    print(matrix)
    print("特征值:", eigenvalues)
    print("特征向量:")
    print(eigenvectors)
    print("-" * 30)
    
    # 示例2: 矩阵的秩
    print("2. 矩阵的秩计算")
    rank_matrix = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
    print("矩阵:")
    print(rank_matrix)
    print("矩阵的秩:", np.linalg.matrix_rank(rank_matrix))
    print("-" * 30)
    
    # 示例3: 奇异值分解(SVD)
    print("3. 奇异值分解(SVD)")
    svd_matrix = np.array([[1, 2], [3, 4], [5, 6]])
    U, s, Vt = np.linalg.svd(svd_matrix, full_matrices=False)
    print("原矩阵:")
    print(svd_matrix)
    print("U矩阵:")
    print(U)
    print("奇异值:", s)
    print("V转置矩阵:")
    print(Vt)
    print("-" * 30)

if __name__ == "__main__":
    # 运行主要演示
    demonstrate_numpy_linear_algebra()
    
    # 运行附加示例
    additional_examples()
    
    print("\n所有NumPy线性代数函数演示完成！")